# -*- coding: utf-8 -*-
from django.db import models
from enum import Enum
from utils.base_models import BaseModel
import os
from datetime import datetime


def upload_to(instance, filename):
    """自定义文件上传路径"""
    # 获取文件扩展名
    ext = filename.split('.')[-1]
    # 生成新的文件名，使用时间戳确保唯一性
    filename = f'{datetime.now().strftime("%Y%m%d%H%M%S")}_{instance.id}.{ext}'
    # 返回完整的上传路径
    return os.path.join('production_issues_images', filename)


class IssueCategory(Enum):
    """问题分类枚举"""
    FUNCTIONAL = "功能性"
    PERFORMANCE = "性能"
    SECURITY = "安全"
    UI = "界面"
    OTHER = "其他"


class ImpactLevel(Enum):
    """影响程度枚举"""
    CRITICAL = "严重"
    MAJOR = "重大"
    MINOR = "一般"
    TRIVIAL = "轻微"


class Status(Enum):
    """解决状态枚举"""
    PENDING = "待解决"
    IN_PROGRESS = "进行中"
    COMPLETED = "已完成"
    ABANDONED = "废弃"


class ProductionIssues(BaseModel):
    """生产问题跟踪模型"""
    # 业务系统（必填）
    business_system = models.CharField(
        max_length=255,
        verbose_name="业务系统",
        help_text="发生问题的业务系统名称"
    )
    
    # 问题描述（必填）
    issue_description = models.TextField(
        verbose_name="问题描述",
        help_text="详细描述生产环境中出现的问题"
    )
    
    # 问题分类（可选）
    issue_category = models.CharField(
        max_length=50,
        choices=[(tag.value, tag.value) for tag in IssueCategory],
        verbose_name="问题分类",
        help_text="问题的分类类型",
        blank=True,
        null=True
    )
    
    # 影响程度（可选）
    impact_level = models.CharField(
        max_length=50,
        choices=[(level.value, level.value) for level in ImpactLevel],
        verbose_name="影响程度",
        help_text="问题对业务的影响程度",
        blank=True,
        null=True
    )

    
    # 发现人（必填）
    reporter = models.CharField(
        max_length=100,
        verbose_name="发现人",
        help_text="发现问题的人员姓名"
    )
    
    # 开发人员
    developer = models.CharField(
        max_length=100,
        verbose_name="开发人员",
        blank=True,
        null=True,
        help_text="负责修复问题的开发人员姓名"
    )
    
    # 测试人员
    tester = models.CharField(
        max_length=100,
        verbose_name="测试人员",
        blank=True,
        null=True,
        help_text="负责验证问题修复的测试人员姓名"
    )
    
    # 解决状态（必填，默认未解决）
    status = models.CharField(
        max_length=50,
        choices=[(status.value, status.value) for status in Status],
        default=Status.PENDING.value,
        blank=True,
        null=True,
        verbose_name="解决状态",
        help_text="问题的解决状态：待解决/进行中/已完成/废弃"
    )
    
    # 解决时间（可选）
    resolution_time = models.DateTimeField(
        verbose_name="解决时间",
        help_text="问题解决的时间",
        blank=True,
        null=True
    )
    
    # 根本原因（可选）
    root_cause = models.TextField(
        verbose_name="根本原因",
        help_text="问题的根本原因分析",
        blank=True,
        null=True
    )
    
    # 解决方案（可选）
    solution = models.TextField(
        verbose_name="解决方案",
        help_text="解决问题的具体方案",
        blank=True,
        null=True
    )
    
    # 备注（可选）
    remarks = models.TextField(
        verbose_name="备注",
        help_text="其他需要说明的信息",
        blank=True,
        null=True
    )
    
    class Meta:
        verbose_name = "生产问题跟踪"
        verbose_name_plural = "生产问题跟踪"
        db_table = "production_issues"
        ordering = ['-create_time']
    
    def __str__(self):
        return f"[{self.business_system}] {self.issue_description[:50]}..." if len(self.issue_description) > 50 else f"[{self.business_system}] {self.issue_description}"


class IssueImage(BaseModel):
    """生产问题图片模型"""
    # 关联的生产问题（可选，用于独立上传）
    issue = models.ForeignKey(
        ProductionIssues,
        on_delete=models.CASCADE,
        related_name='images',
        verbose_name='关联的生产问题',
        help_text='关联的生产问题',
        blank=True,
        null=True
    )
    
    # 图片文件
    image = models.ImageField(
        upload_to=upload_to,
        verbose_name='问题图片',
        help_text='生产问题的相关图片'
    )
    
    # 图片描述
    description = models.CharField(
        max_length=255,
        verbose_name='图片描述',
        help_text='图片的简单描述',
        blank=True,
        null=True
    )
    
    class Meta:
        verbose_name = '生产问题图片'
        verbose_name_plural = '生产问题图片'
        db_table = 'issue_images'
        ordering = ['-create_time']
    
    def __str__(self):
        return f"{self.issue.business_system} - 图片 {self.id}"